package hentai.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

@Data
@NoArgsConstructor
@AllArgsConstructor
// 为Product类加上@Component注解，即表明此类是bean
@Component("p")
public class Product {
    private int id;
    private String name = "product 1";
    // 属性前加上@Autowired注解对该属性进行注入
    // 该注解默认使用byType的方式进行注入，即寻找与该属性类型相同的一个bean实例注入到此处
//    @Autowired(required = false)
//    @Qualifier("ccc")
    // 除了@AutoWired，也可以使用@Resource
    // @Resource不是spring提供的注解
    // 但是spring会识别它并优先按照byName的方式注入，当byName方式找不到合适bean时再进行byType注入
    // byName即寻找名字与该属性字段名相同的一个bean实例注入到此处
    // @Resource注解可以可以指定 name、type 两个属性
    // @Resource装配顺序
    //　　1. 如果同时指定了name和type，则从Spring上下文中找到唯一匹配的bean进行装配，找不到则抛出异常
    //　　2. 如果指定了name，则从上下文中查找名称（id）匹配的bean进行装配，找不到则抛出异常
    //　　3. 如果指定了type，则从上下文中找到类型匹配的唯一bean进行装配，找不到或者找到多个，都会抛出异常
    //　　4. 如果既没有指定name，又没有指定type，则自动按照byName方式进行装配；如果没有匹配，则回退为一个原始类型进行匹配，如果匹配则自动装配；
//    @Resource(name = "c", type = Category.class)
    private Category category;
    // 将 @Autowired 注解到该属性的setter方法上也可以达到相同的效果
}
